#ifndef __WON_LITTLEENDIAN_H__
#define __WON_LITTLEENDIAN_H__

#include "WONShared.h"
#include "Platform.h"


namespace WONAPI
{

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
inline bool IsLittleEndian()
{
	short aTest = 1;
	return ((*(char*)&aTest)&1)?true:false;
}

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
inline unsigned short ShortToLittleEndian(unsigned short theShort)
{
	if(IsLittleEndian())
		return theShort;
	else
		return (theShort>>8) | (theShort<<8);
}

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
inline unsigned short ShortFromLittleEndian(unsigned short theShort)
{
	return ShortToLittleEndian(theShort);
}

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
inline unsigned long LongToLittleEndian(unsigned long theLong)
{
	if(IsLittleEndian())
		return theLong;
	else
		return (theLong>>24) | ((theLong>>8)&0xFF00) | ((theLong<<8)&0xFF0000) | (theLong<<24);
}

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
inline unsigned long LongFromLittleEndian(unsigned long theLong)
{
	return LongToLittleEndian(theLong);
}

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
inline unsigned __int64 Int64ToLittleEndian(unsigned __int64 theInt64)
{
	if(IsLittleEndian())
		return theInt64;
	else
	{
		return (theInt64>>56) | ((theInt64>>40)&0xFF00) | ((theInt64>>24)&0xFF0000) | ((theInt64>>8)&0xFF000000) | 
		((theInt64<<8)&0xFF00000000) | ((theInt64<<24)&0xFF0000000000) | ((theInt64<<40)&0xFF000000000000) 
		| (theInt64<<56);
	}
}

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
inline unsigned __int64 Int64FromLittleEndian(unsigned __int64 theInt64)
{
	return Int64ToLittleEndian(theInt64);
}

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
inline void BufferToLittleEndian(void* theBufferP, int theSize)
{
	if(IsLittleEndian())
		return;
	else
	{
		BYTE* aStartBufferP = (BYTE*)theBufferP;
		BYTE* anEndBufferP = aStartBufferP+theSize-1;
		while(aStartBufferP != anEndBufferP)
			std::swap(*(aStartBufferP++), *(anEndBufferP--));
	}
}

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
inline void BufferFromLittleEndian(void* theBufferP, int theSize)
{
	BufferToLittleEndian(theBufferP, theSize);
}

};


#endif
